package projEscola;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.TreeSet;

public class CEscola implements Serializable {
	
	/**
	 * Attributes of class escola
	 */
	private static final long serialVersionUID = 1L;
	TreeSet<CCurso> Tcurso = new TreeSet<CCurso>();
	TreeSet<CTurma> Tturma = new TreeSet<CTurma>();
	TreeSet<CProfe> TProfe = new TreeSet<CProfe>();
	TreeSet<CAluno> TAluno = new TreeSet<CAluno>();
	String nome;
	
	public CEscola(String nm){
		nome = nm;
	}
	
	/**
	 * @param nomeArquivo
	 * metodo que recebe o nome do arquivo e o inicializa
	 */
	public void inicializarArq(String tipo, String nomeArquivo){
		try {
			FileOutputStream foutArq = new FileOutputStream(nomeArquivo, true);
			FileInputStream finpArq = new FileInputStream(nomeArquivo);
			if(finpArq.read() == -1){
				if (tipo == "curso") {
					TreeSet<CCurso> arvore = new TreeSet<CCurso>();
					ObjectOutputStream objWriter = new ObjectOutputStream(foutArq);
					objWriter.writeObject(arvore);
					objWriter.close();
				}
			finpArq.close();
			}
		}
		catch (FileNotFoundException e) {
		System.out.println("Erro ao inicializar arquivo");
		}
		catch (IOException e) {
		System.out.println("Deu zebra");
		}
	}
	
	/**
	 * metodo que recebe uma arvore e o nome de um arquivo para gravar a arvore no arquivo
	 * @param ts - arvore com os dados a serem gravados
	 * @param nomeArquivo - nome do arquivo a ser gravado
	 * @throws IOException
	 */
	public void escreverNoArquivo(TreeSet ts, String nomeArquivo) throws IOException{
		FileOutputStream fos = new FileOutputStream(nomeArquivo);
		ObjectOutputStream objWrite = new ObjectOutputStream(fos);
		objWrite.writeObject(ts); //gravando as auterações no arquivo
		objWrite.close();
	}
	
	/**
	 * metodo que recebe o nome do arquivo e ler o seu conteudo 
	 */

	public TreeSet lerNoArquivo(String nomeArquivo) throws IOException, ClassNotFoundException{
		TreeSet arvore;// = new TreeSet(); // criação de uma coleção que guardará todos os alunos
		FileInputStream fis = new FileInputStream(nomeArquivo); //leitura do arquivo contendo os alunos já adicionados
		ObjectInputStream objRead = new ObjectInputStream(fis);				
		arvore = (TreeSet)objRead.readObject(); 
		objRead.close();
		return arvore;
	}

	
	/**
	 * metodo para cadastrar cursos
	 */
	public boolean cadastrarCurso(CCurso o){
		if (Tcurso.add(o)){
			try {
				escreverNoArquivo(Tcurso, "curso.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return true; // adicionando um novo objeto na árvore
		}
		return false;		
	}
	
	/**
	 * metodo para listar os cursos
	 * @return
	 */
	public TreeSet<CCurso> listarCurso(){
		try {
			Tcurso = lerNoArquivo("curso.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return Tcurso;
	}
	
	/**
	 * metodo para pesquisar cursos
	 * @param o
	 * @return
	 */
	public boolean pesquisarCurso(CCurso o){
		try {
			Tcurso = lerNoArquivo("curso.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		boolean contem;
			contem = Tcurso.contains(o);
		return contem;
	}
	
	/**
	 * metodo para remover curso
	 * @param o
	 * @return
	 */
	public boolean removerCurso(CCurso o){		
		try {
			Tcurso = lerNoArquivo("curso.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		boolean remove = Tcurso.remove(o); // remove o curso na árvore 
		try {
			escreverNoArquivo(Tcurso, "curso.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return remove;
	}
	
	/**
	 * metodo para cadastrar turmas
	 * @param t
	 * @return
	 */
		public boolean cadastrarTurma(CTurma t){
			if (Tturma.add(t)){
				try {
					escreverNoArquivo(Tturma, "turma.dat");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return true; // adicionando um novo objeto na árvore
			}
			return false;		
		}
		
		/**
		 * metodo para pesquisar turma
		 * @param t
		 * @return
		 */
		public boolean pesquisarTurma(CTurma t){
			try {
				Tturma = lerNoArquivo("turma.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			boolean contem= false;
				contem = Tturma.contains(t);
			return contem;
		}
		
		/**
		 * metodo para listar turmas
		 * @return
		 */
		public TreeSet listarTurma(){
			try {
				Tturma = lerNoArquivo("turma.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return Tturma;
		}
		
		/**
		 * metodo para remover turma
		 * @param t
		 * @return
		 */
		public boolean removerTurma(CTurma t){		
			try {
				Tturma = lerNoArquivo("turma.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			boolean remove = Tturma.remove(t); // remove o curso na árvore 
			try {
				escreverNoArquivo(Tturma, "turma.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return remove;
		}
	
		/**
		 * metodo para cadastrar professor
		 * @param p
		 * @return
		 */
		public boolean cadastrarProfessor(CProfe p) {
			if (TProfe.add(p)){
				try {
					escreverNoArquivo(TProfe, "profe.dat");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return true; // adicionando um novo objeto na árvore
			}
			return false;			
		}
		
		/**
		 * metodo para pesquisar professor
		 * @param p
		 * @return
		 */
		public boolean pesquisarProfessor(CProfe p) {
			try {
				TProfe = lerNoArquivo ("profe.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			boolean contem;
				contem = TProfe.contains(p);
			return contem;
		}
		
		/**
		 * metodo para listar professores
		 * @return
		 */
		public TreeSet listarProfessor() {		
			try {
				TProfe = lerNoArquivo("profe.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return TProfe;
			}

		/**
		 * metodo para remover professor
		 * @param p
		 * @return
		 */
		public boolean removerProfessor(CProfe p){
			try {
				TProfe = lerNoArquivo("profe.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			boolean remove = TProfe.remove(p); // remove o curso na árvore 
			try {
				escreverNoArquivo(TProfe, "profe.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return remove;
		}
		
		/**
		 * metodo para cadastrar aluno recebendo um ojbeto aluno
		 * @param a
		 * @return
		 */
		
		public boolean cadastrarAluno(CAluno a) {
			if (TAluno.add(a)){
				try {
					escreverNoArquivo(TAluno, "aluno.dat");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return true; // adicionando um novo objeto na árvore
			}
			return false;
		}
		
		/**
		 * metodo para pesquisar um aluno recebendo o um objeto aluno e retornando sim ou nao
		 * @param a
		 * @return
		 */
		public boolean pesquisarAluno(CAluno a) {
			try {
				TAluno = lerNoArquivo("aluno.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			boolean contem;
				contem = TAluno.contains(a);
			return contem;
		}

		/**
		 * metodo para listar os alunos retornando a arvore de alunos
		 * @return
		 */
		public TreeSet listarAluno() {		
			try {
				Tcurso = lerNoArquivo("aluno.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return TAluno;
		}

		/** 
		 * metodo para remover aluno 
		 * @param a
		 * @return
		 */
		public boolean removerAluno(CAluno a){
			try {
				Tcurso = lerNoArquivo("aluno.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			boolean remove = TAluno.remove(a); // remove o curso na árvore 
			try {
				escreverNoArquivo(TAluno, "aluno.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return remove;
		}
		
		
}
